iT邦幫忙

2023 iThome 鐵人賽

DAY 6
0

套件安裝

  • 安裝 Asana
    pipenv install asana
    

從 API 到程式開發

Get multiple workspaces 的範例

  • 接著來看下方程式碼,這個是官網給的範例,裡面有些東西用不到的建議先拿掉
  • 不要把機敏資訊寫在程式碼裡面,要抽離出來,避免不小心被版控
    import asana
    from asana.rest import ApiException
    from pprint import pprint
    
    # Configure OAuth2 access token for authorization: oauth2
    configuration = asana.Configuration()
    configuration.access_token = '<YOUR_PERSONAL_ACCESS_TOKEN>'
    api_client = asana.ApiClient(configuration)
    
    # create an instance of the API class
    api_instance = asana.WorkspacesApi(api_client)
    limit = 50 # int | Results per page. The number of objects to return per page. The value must be between 1 and 100. (optional)
    offset = 'eyJ0eXAiOJiKV1iQLCJhbGciOiJIUzI1NiJ9' # str | Offset token. An offset to the next page returned by the API. A pagination request will return an offset token, which can be used as an input parameter to the next request. If an offset is not passed in, the API will return the first page of results. 'Note: You can only pass in an offset that was returned to you via a previously paginated request.' (optional)
    opt_fields = ["email_domains","is_organization","name","offset","path","uri"] # list[str] | This endpoint returns a compact resource, which excludes some properties by default. To include those optional properties, set this query parameter to a comma-separated list of the properties you wish to include. (optional)
    
    try:
        # Get multiple workspaces
        api_response = api_instance.get_workspaces(limit=limit, offset=offset, opt_fields=opt_fields)
        pprint(api_response)
    except ApiException as e:
        print("Exception when calling WorkspacesApi->get_workspaces: %s\n" % e)
    

寫成自己要的版本

  • 拔掉該拔的東西:沒用到的參數定義、不該寫死的機敏資訊、沒用到的套件、不必要的輸出
  • 加入該加的東西:configparser 和對應的內容、多產生一個檔案用來存 PAT
    import asana
    import configparser
    from asana.rest import ApiException
    
    def get_workspaces():
        # Configure OAuth2 access token for authorization: oauth2
        configuration = asana.Configuration()
        config = configparser.ConfigParser()
        config.read('config.ini')
        configuration.access_token = config['Asana']['asana_token']
        api_client = asana.ApiClient(configuration)
    
        # create an instance of the API class
        api_instance = asana.WorkspacesApi(api_client)
    
        try:
            # Get multiple workspaces
            api_response = api_instance.get_workspaces()
            return api_response
        except ApiException as e:
            print("Exception when calling WorkspacesApi->get_workspaces: %s\n" % e)
    
    
    • 原本的 configuration.access_token = '<YOUR_PERSONAL_ACCESS_TOKEN>' 被我換成 configuration.access_token = config['Asana']['asana_token']
    • 透過外部讀檔的方式,拿到 Token
    • 原本的 12 ~ 14 因為沒有用到,都砍掉
      • If an offset is not passed in, the API will return the first page of results.
      • 'Note: You can only pass in an offset that was returned to you via a previously paginated request.' (optional)
    • 改好後,呼叫出來測測看
    >>> worksp = get_workspaces()
    >>> type(worksp)
    <class 'asana.models.workspace_response_array.WorkspaceResponseArray'>
    >>> 
    

資料型態與方法

  • 拿到了 WorkspaceResponseArray 並不是常見可以直接拿來用的資料型別
  • 要不看文件找方法,要不直接 dir() 拆開來玩,而我選擇懶得看文件的做法
  • 發現裡面有個 to_dict() 可以用
    >>> worksp.to_dict()
    {'data': [{'gid': '1xxxxxxxxxxxxxx8', 'resource_type': 'workspace', 'name': 'xxx.com', 'email_domains': None, 'is_organization': None}], 'next_page': None}
    

思考要做出哪些 function

  • 這時候你如果想問,何必大費周章寫一堆程式來拿 gid,啊我程式擺著產出自己投影片,gid 又不會變
  • 其實你說的都對,如果你不介意讓別人知道你的 gid、以後也不會加入新的 Asana Workspace、程式也不會拿給別人用的話,真的都無所謂
  • 剩下的就是順藤摸瓜
    https://ithelp.ithome.com.tw/upload/images/20230907/20141784Ue2NGXpPcc.png
  • 從 PAT 出發,先取得所在 workspace(s)、...、取得工作卡片 (Tasks)
  • 依照原版的投影片,報告第一頁是封面、第二頁是大綱、接著依照組員一個一個列出工作項目
    1. Get multiple workspaces
      • 拿到 Token 持有人所處的 workspace
    2. Get teams in a workspace
      • 給 workspace global id 後,拿回團隊資料,以我來說,我會拿到 超強的材料研發組負責訂便當的庶務組 還有 總經理室 之類的東西
    3. Get a team's projects
      • 給 team global id 後,拿回歸屬在該團隊的專案
    4. Get tasks from a project
      • 給 project global id 後,拿回所有的 Tasks
      • 到這邊差不多就是一趟順藤摸瓜,但是,一次拿回一票 Tasks 成本有點高,所以要透過 filter 再去多多過濾
    5. Get multiple tasks
      • 必需要 workspace,和另一個條件參數如 assignee
    6. Get a task

總結

  • 本日更新程式碼:https://github.com/rita0124/slide-generator/commit/8af395fe17cf5d18af4f4b6e6029c110437b275d
  • 摸瓜完後,我需要一些時間開發功能
  • 先來看個卡片裡的資訊
    https://ithelp.ithome.com.tw/upload/images/20230907/20141784wg6iBOGGMO.png
  • 下一回,要從 API 拿回的結果去拼湊出,卡片裡面看到的資訊

上一篇
Day 5 - 準備投影片資料,認識看板流與 Asana API
下一篇
Day 7 - 實作 Kanban 類別、建構子
系列文
挽救肝指數 x 職場生存術 x 老闆愛看的投影片製造機30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言